function fn1() {
  /* ip1大返1 小返-1 平返0 */
  function compare(ip1 = "", ip2 = "") {
    // 将ip炸碎为number数组 ["1","2","3","4"] 映射为 [1,2,3,4]
    const arr1 = ip1.split(".").map((item) => item * 1);
    const arr2 = ip2.split(".").map((item) => item * 1);

    // 按照数组顺序从前往后比较
    for (let i = 0; i < arr1.length; i++) {
      // 在任何序号下 发现大小关系 就直接返回1/-1 中断比较
      if (arr1[i] > arr2[i]) {
        return 1;
      }
      if (arr1[i] < arr2[i]) {
        return -1;
      }
    }

    // 四段都走完 没有发现大小关系 直接返回0
    return 0;
  }

  console.log(compare("1.2.3.4", "1.1.3.4")); //1
  console.log(compare("1.11.3.4", "1.2.3.4")); //1
  console.log(compare("1.2.3.4", "1.11.3.4")); //-1
  console.log(compare("1.2.3.4", "1.2.3.4")); //0
}

/* Promise版 */
function fn2() {
  function executeWithTimeout(ajaxPromise, ms) {
    /* 
    返回一个Promise对象： 
    ms到期时强制reject
    网络数据回来则resolve
    */
    return new Promise((resolve, reject) => {
      /* ms到期时强制reject */
      let timer = setTimeout(() => {
        reject("timeout");
      }, ms);

      /* 
      网络数据回来则resolve 
      网络数据什么时候回来？要看ajaxPromise什么时候履约
      */
      ajaxPromise()
        // 网络Promise5秒后履约
        .then((data) => {
          // 先清除延时定时器
          clearTimeout(timer);

          // 对外resolve数据
          resolve(data);
        });
    });
  }

  /* 网络promise */
  function ajaxPromise() {
    return new Promise((resolve) =>
      setTimeout(() => {
        resolve(`来自淘宝的数据`);
      }, 1000)
    );
  }

  executeWithTimeout(ajaxPromise, 3000)
    .then((data) => console.log(data))
    .catch((err) => console.log(err));
}

/* async版 */
function fn2X() {
  async function executeWithTimeout(fn, ms) {
    return new Promise(async (resolve, reject) => {
      // ms毫秒以后暴力超时
      let timer = setTimeout(() => {
        // reject超时
        reject("timeout");
      }, ms);

      /* 死等履约 成功后清除定时器+resolve数据 */
      const data = await fn();
      clearTimeout(timer);
      resolve(data);
    });
  }

  const timeout = 5000;
  function rq(url) {
    return new Promise((resolve) => {
      /* 超时后reject */
      setTimeout(() => {
        resolve(`来自${url}的数据`);
      }, timeout);
    });
  }

  async function fn1() {
    return rq("https://www.taobao.com");
  }

  executeWithTimeout(fn1, 3000)
    .then((value) => console.log("value=", value))
    .catch((err) => console.log("err=", err));
}

/*  */
function fn3() {
  /* url进去 获取对应页面的Promise对象出来 */
  async function getContentByUrl(url) {
    // 返回一个1秒后履约页面内容的Promise对象
    return new Promise((resolve, reject) =>
      setTimeout(() => {
        Math.random() > 0.5 ? resolve(`${url}的页面内容`) : reject("timeout");
      }, 1000)
    );
  }

  const urls = [
    "https://www.taobao.com",
    "https://www.baidu.com",
    "https://web.taobao.com",
  ];

  /* 分步骤版 */
  async function fetchDataSplited(urls = []) {
    // 过滤掉非淘宝的url
    urls = urls.filter((url) => url.endsWith("taobao.com"));

    // 将url数组映射成Promise数组（以便调度）
    const ajaxPromises = urls.map((url) => getContentByUrl(url));

    // 用【完全期约：要求每个Promise都落地】调度这个Promise数组
    const allSettledPromise = Promise.allSettled(ajaxPromises);

    // 返回这个完全期约
    return allSettledPromise;
  }

  async function fetchData(urls = []) {
    // 返回这个完全期约
    return Promise.allSettled(
      urls
        .filter((url) => url.endsWith("taobao.com"))
        .map((url) => getContentByUrl(url))
    );
  }

  // 返回一个【完全期约】
  fetchData(urls)
    // 【完全期约】中的每一个Promise都落地时回调 results是一个结果数组
    .then((results) => console.log(results));
}
fn3();
